package org.psjava.judgesubmit; import java.io.File; import java.io.IOException; import java.util.Map; import java.util.Scanner; import org.apache.commons.lang3.StringEscapeUtils; import org.psjava.ds.queue.Queue; import org.psjava.goods.GoodQueueFactory; import org.psjava.util.AssertStatus; import org.psjava.util.Pair; import org.puredevteam.httpclient.SocketConnectionData; public class MockHttpClient { public static JudgeHttpClient create(SocketConnectionData conn) { final String caller = RecordingHttpClient.toCallerKey(Thread.currentThread().getStackTrace()[2]); final Queue<Pair<String, String>> q = GoodQueueFactory.getInstance().create(); File f = RecordingHttpClient.getRecordFile(caller); AssertStatus.assertTrue(f.exists(), "not exist for caller: " + caller); try { Scanner in = new Scanner(f); while (in.hasNextLine()) { String key = StringEscapeUtils.unescapeJava(in.nextLine()); String body = StringEscapeUtils.unescapeJava(in.nextLine()); q.enque(Pair.create(key, body)); } in.close(); } catch (IOException e) { throw new RuntimeException(e); } return new JudgeHttpClient() { @Override public void clearCookie() { // ignores. } @Override public String receivePostBodyString(String path, Map<String, String> param, String encoding) throws IOException, JudgeServiceException { return dequeBody(q, RecordingHttpClient.toPostRequestKey(path, param, encoding)); } @Override public String receiveGetBodyString(String path, String encoding) throws IOException, JudgeServiceException { return dequeBody(q, RecordingHttpClient.toGetResultKey(path, encoding)); } private String dequeBody(final Queue<Pair<String, String>> q, String key) { AssertStatus.assertTrue(!q.isEmpty(), "no more mock data: " + key); Pair<String, String> p = q.deque(); if (!p.v1.equals(key)) throw new RuntimeException("invalid request. next data is " + p.v1 + " but requested " + key); return p.v2; } }; } }